package main

import (
	"bufio"
	"fmt"
	"io"
	"io/ioutil"
	"os"
	"strconv"
)

const filePath = "src/sgg/文件/test"
const preFix = "src/sgg/文件/"

func main() {
	//openAndClose()
	//ReadFile2()
	//WriteFile()
	//copyContent()
	bytes, err := copyFile("src/sgg/文件/assets/testImg_copy.png", "src/sgg/文件/assets/testImg.png")
	if err != nil {
		fmt.Println("拷贝出错", err)
	} else {
		fmt.Println("拷贝的字节数:", bytes)
	}
}
func openAndClose() {
	//file 是指针类型
	file, err := os.Open("src/sgg/文件/test")
	if err != nil {
		fmt.Println("打开文件出错", err)
	}
	fmt.Printf("file 类型:%T\n", file)
	fmt.Println("打开的文件名：", file.Name())
	/*var content []byte
	bytes, err := file.Read(content)
	if err != nil {
		fmt.Println("读取文件出错", err)
	}
	fmt.Println("读取到文件的字节数:", bytes)
	fmt.Println("文件内容:")
	fmt.Println(content)*/
	err = file.Close()
	if err == nil {
		fmt.Printf("文件关闭成功")
	}
}
func ReadFile() {
	file, err := os.Open(filePath)
	if err != nil {
		fmt.Println("打开文件出错", err)
	}
	defer file.Close()
	//返回的Reader对象，默认带4096个字节的缓冲区
	reader := bufio.NewReader(file)
	for true {
		content, err := reader.ReadString('\n')

		if err != nil {
			if err == io.EOF {
				fmt.Println("读取结束")
				break
			}
			fmt.Println("读取文件失败，", err)
			break
		}
		fmt.Println("读取到内容:", content)
	}
}
func ReadFile2() {
	bytes, err := ioutil.ReadFile(filePath)
	if err != nil {
		fmt.Println("读取文件出错:", err)
	}
	fmt.Println("文件内容:")
	fmt.Println(string(bytes))
}
func WriteFile() {
	file, err := os.OpenFile(preFix+"my.txt", os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
		fmt.Println("打开文件出错", err)
		return
	}
	writer := bufio.NewWriter(file)
	for i := 0; i < 5; i++ {
		count, err := writer.WriteString("hello writer:" + strconv.Itoa(i) + "\n")
		fmt.Println("写入的字节数:", count)
		if err != nil {
			fmt.Println("写入文件错误", err)
		}
	}
	//清空缓存写入磁盘
	_ = writer.Flush()
	//关键文件流
	defer file.Close()
}

//赋值文件内容到另一个文件
func copyContent() {
	source := preFix + "test"
	target := preFix + "my.txt"

	sourceFile, err := ioutil.ReadFile(source)
	if err != nil {
		fmt.Println("读取文件出错")
	}
	fmt.Println("源文件内容：", string(sourceFile))
	err = ioutil.WriteFile(target, sourceFile, 0666)
	if err != nil {
		fmt.Println("写入文件出错")
	}
	fmt.Println("写入成功")
}

/*
   判断文件或文件夹是否存在
   如果返回的错误为nil,说明文件或文件夹存在
   如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在
   如果返回的错误为其它类型,则不确定是否在存在
*/
func PathExists(path string) (bool, error) {

	_, err := os.Stat(path)
	if err == nil {
		return true, nil
	}
	if os.IsNotExist(err) {
		return false, nil
	}
	return false, err
}

//拷贝文件
func copyFile(destFileName, srcFileName string) (written int64, err error) {
	srcFile, err := os.Open(srcFileName)
	if err != nil {
		fmt.Println("打开原文件出错:", err)
		return 0, err
	}
	srcReader := bufio.NewReader(srcFile)

	destFile, err := os.OpenFile(destFileName, os.O_WRONLY|os.O_CREATE, 0666)
	if err != nil {
		fmt.Println("打开目/创建目标文件出错,", err)
		return 0, err
	}
	writer := bufio.NewWriter(destFile)
	defer srcFile.Close()
	defer destFile.Close()
	return io.Copy(writer, srcReader)
}
